package cn.tedu.hotel.serve.mapper;

import cn.tedu.hotel.serve.pojo.entity.HotelRoomNotes;
import cn.tedu.hotel.serve.pojo.entity.Orders;
import cn.tedu.hotel.serve.pojo.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

@Repository
public interface OrdersMapper {
    /**
     * 新增订单
     * @param order
     * @return
     */
    int addOrder(Orders order);

    /**
     * 增加订单时，修改酒店的房间数并记录
     * @param hotelRoomNotes
     * @return
     */
    int addHotelRoomNotes(HotelRoomNotes hotelRoomNotes);

    /**
     * 根据以下的参数查找note表中的信息
     * @param hotelId
     * @param roomId
     * @param currentDatetime
     * @return
     */
    List<HotelRoomNotesVO> getNotesByThreeColumn(
            @Param("hotelId") Long hotelId,
            @Param("roomId") Long roomId,
            @Param("currentDatetime") List<LocalDateTime> currentDatetime);

    /**
     * 根据以下的参数查找note表中的单个信息
     * @param hotelId
     * @param roomId
     * @param currentDatetime
     * @return
     */
    HotelRoomNotesVO getSingleNotesByThreeColumn(
            @Param("hotelId") Long hotelId,
            @Param("roomId") Long roomId,
            @Param("currentDatetime") LocalDateTime currentDatetime);

    /**
     * 修改酒店房间记录表中的房间数据
     * @param remainder
     * @return
     */
    int updateHotelRoomNotes(
            @Param("remainder") Integer remainder,
            @Param("hotelId") Long hotelId,
            @Param("roomId") Long roomId,
            @Param("currentDatetime") LocalDateTime currentDatetime
            );

    /**
     * 根据用户id查询该用户的订单集合
     * @param userId 用户id
     * @return 用户的订单集合
     */
    List<UserOrdersListVO> getUserOrdersList(Long userId);

    /**
     * 根据用户ID查询最新订单信息
     * @param userId
     * @return
     */
    OrderVO getLatestOrderById(Long userId);

    /**
     * 根据订单ID查找订单信息
     * @param id
     * @return
     */
    OrderVO getOrderById(Long id);

    /**
     * 根据HotelRoomsNotes中的id来进行删除
     * @param id
     * @return
     */
    int deleteHotelRoomsNotesById(Long id);

    /**
     * 根据订单ID删除订单
     * @param id
     * @return
     */
    int deleteOrderById(Long id);

    /**
     * 后台获取订单列表
     * @return
     */
    List<OrdersWithStateListVO> getAdminUserOrdersList();

    /**
     * 根据订单ID删除订单状态表中的数据
     * @param orderId
     * @return
     */
    int deleteOrderState(Long orderId);
}
